import { cached } from './cached.mts';

// import { countCalls } from './decorators.mjs';

// import { measureTime } from './decorators.mjs';

// class Calculator {
//   @measureTime
//   add(a: number, b: number) {
//     // 模拟计算延迟
//     for (let i = 0; i < 1000000; i++) {}
//     return a + b;
//   }

//   @measureTime
//   async fetchData() {
//     await new Promise((resolve) => setTimeout(resolve, 1000));
//     return 'data';
//   }
// }

// // 使用
// const calc = new Calculator();
// calc.add(2, 3); // 应输出：add 执行耗时: XX ms
// await calc.fetchData(); // 应输出：fetchData 执行耗时: 100X ms

// class Greeter {
//   @countCalls
//   sayHello(name: string) {
//     return `Hello, ${name}!`;
//   }

//   @countCalls
//   sayGoodbye() {
//     return 'Goodbye!';
//   }
// }

// const greeter = new Greeter();
// greeter.sayHello('Alice'); // sayHello 已被调用 1 次
// greeter.sayHello('Bob'); // sayHello 已被调用 2 次
// greeter.sayGoodbye(); // sayGoodbye 已被调用 1 次

class MathService {
  @cached
  factorial(n: number): number {
    console.log(`计算 ${n}!`);
    if (n <= 1) return 1;
    return n * this.factorial(n - 1);
  }

  @cached
  add(a: number, b: number, c: number) {
    console.log(`计算 ${a} + ${b} + ${c}`);
    return a + b + c;
  }
}

const math = new MathService();
console.log(math.factorial(5)); // 计算 5!，输出 120
console.log(math.factorial(5)); // 命中缓存，直接输出 120
console.log(math.add(1, 2, 3)); // 计算 1 + 2 + 3，输出 6
console.log(math.add(1, 2, 3)); // 命中缓存，直接输出 6
